﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using vudu.Logica.Clases;


namespace vudu.EnlaceDatos.SqlServer
{
    /// <summary>
    /// Clase que gestiona todas las operaciones de Pensum
    /// </summary>

    public class SqlServerPensum
    {
        #region Insertar Pensum
        /// <summary>
        /// Este metodo se encarga de insertar un nuevo Pensum a la base de datos
        /// </summary>
        public bool insertarPensum(Pensum miPensum, int IDEscuela)
        {
            //Se instancian las conexiones
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlServerPensum miServer = new SqlServerPensum();
            int idEscuela = IDEscuela;
            bool verificarPensum = true;
           // int idEscuela = miEscuela;
           
            
            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarPensum]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server
                command.Parameters.AddWithValue("@fechaInicio", miPensum.FechaInicio);
                command.Parameters.AddWithValue("@fechaFin", miPensum.FechaFin);
                command.Parameters.AddWithValue("@statusPensum", miPensum.StatusPensum);
                command.Parameters.AddWithValue("@urlPensum", miPensum.CreditoPensum);
                command.Parameters.AddWithValue("@fk_id_escuela",idEscuela);

                command.Parameters["@fechaInicio"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaFin"].Direction = ParameterDirection.Input;
                command.Parameters["@statusPensum"].Direction = ParameterDirection.Input;
                command.Parameters["@urlPensum"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_id_escuela"].Direction = ParameterDirection.Input;
                //Se ejecuta la insercion de pensum
                command.ExecuteReader();
                int idPensumInsertado = miServer.consultarUltimoIdPensum();
                miPensum.IdPensum = idPensumInsertado;

                miPensum.insertarPrelacion(miPensum);

            }
            catch (SqlException)
            {
              verificarPensum = false;
              throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return verificarPensum;
        }
        #endregion

        #region insertar Prelacion
        /// <summary>
        /// Este metodo hace inserta las prelaciones de una materia en la base de datos
        /// </summary>
        public bool insertarPrelacionBD(Prelacion miMateriaActual,int idMateriaActual,int idMateriaPrela,int idPensum)
        {
            bool VerificarInsercion = true;
            //Se instancian las conexiones
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarPrelacion]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server
                command.Parameters.AddWithValue("@semestre", miMateriaActual.SemestreMateriaPensum);
                command.Parameters.AddWithValue("@credito", miMateriaActual.CreditoMateriaPensum);
                command.Parameters.AddWithValue("@fk_id_materia", idMateriaActual);
                if (idMateriaPrela == -1)
                {
                    command.Parameters.AddWithValue("@fk_id_materia_prela", DBNull.Value);
                }else
                    command.Parameters.AddWithValue("@fk_id_materia_prela", idMateriaPrela);

                command.Parameters.AddWithValue("@fk_id_pensum", idPensum);
                command.Parameters["@semestre"].Direction = ParameterDirection.Input;
                command.Parameters["@credito"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_id_materia"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_id_materia_prela"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_id_pensum"].Direction = ParameterDirection.Input;
                command.ExecuteReader();

            }
            catch (SqlException)
            {
                VerificarInsercion = false;
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return VerificarInsercion;
        }
        #endregion fin de insertar Prelacion

        #region Consultar Id de Pensum
        /// <summary>
        /// Este metodo devuelve el Id del Pensum requerido que se encuentra en la base de datos
        /// </summary>
        public int consultarIdPensum(Pensum miPensum)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarIdPensum]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idPensum", miPensum.IdPensum);
                command.Parameters["@idPensum"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                command.ExecuteReader();

                int idPensumBuscado = (int)command.Parameters["@idPensum"].Value;
                //Retorna el id del pensum 
                return idPensumBuscado;
            }
            catch (SqlException)
            {
                return 0;//cambiar luego es una prueba
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion Final de consultar Id Pensum

        #region Consultar Ultimo Pensum Insertado
        /// <summary>
        /// Este metodo devuelve el Id del ultimo Pensum insertado en la base de datos
        /// </summary>
        public int consultarUltimoIdPensum()
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            int idUltimoPensum=-1;

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[consultarUltimoPensum]";
                command.CommandTimeout = 10;


                //Se ejecuta la busqueda del ultimo pensum
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    idUltimoPensum = reader.GetInt32(0);

                }
                return idUltimoPensum;


            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }



        }
        #endregion

        #region Consultar Materias para Pensum
        /// <summary>
        /// Este metodo devuelve la lista de materias del "Sistema"
        /// Consideraciones:
        /// No se toma en cuenta para que Escuela ni Universidad pertenecen cada materia
        /// ya que no fue implementado en el modelo
        /// </summary>
        public List<Materia> consultarMaterias()
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Materia> miListaMateria= new List<Materia>();
            
            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[buscarMateriasPensum]";
                command.CommandTimeout = 10;

                //se ejecuta el metodo del store procedure que busca todas las materias del sistema
                reader = command.ExecuteReader();

                //Se recorre cada row
                while (reader.Read())
                {
                    Materia miMateria = new Materia(); 
                    //Se asigna cada atributo al objeto materia
                    miMateria.Codigo = reader.GetInt32(0);
                    miMateria.Nombre = reader.GetString(1);
                    miMateria.HorasTeoria = reader.GetInt32(2);
                    miMateria.HorasPractica = reader.GetInt32(3);
                    miMateria.Descripcion = reader.GetString(4);
                    miMateria.Estatus = reader.GetString(5);
                    //se inserta la materia en la lista de materias
                    miListaMateria.Add(miMateria);
                }

                return miListaMateria;
            }
            catch (SqlException)
            {
                return miListaMateria;//cambiar luego es una prueba
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin de consultar las materias para Pensum

        #region Consultar el Id de una Materia
        /// <summary>
        /// Este metodo devuelve el Id de una materia 
        /// </summary>
        public int consultarIdMateria(Materia miMateria)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            int idPensumBuscado = -1;
   
            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarIdMateria]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@nombreMateria", miMateria.Nombre);
                command.Parameters["@nombreMateria"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    idPensumBuscado = reader.GetInt32(0);
                }
              //Retorna el id del pensum 
                return idPensumBuscado;
            }
            catch (SqlException)
            {
                return idPensumBuscado;//no se encontro el id del pensum buscado
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin de consultar el Id de una Materia

        #region Consultar Materias de un Pensum en de escuela
        /// <summary>
        /// Aqui se calcula las materias pertenecientes a un pensum
        /// </summary>
        /// <param name="idEscuela"></param>
        /// <param name="idPensum"></param>
        /// <returns>retorna la lista de prelaciones de un determinado pensem para una determinada escuela</returns>
        public List<Prelacion> ConsultarMateriasPensum(int idEscuela, int idPensum)
        {

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Prelacion> miListaPrelacion = new List<Prelacion>();

            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_materias_pensum]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Prelacion miPrelacion = new Prelacion();
                    miPrelacion.SemestreMateriaPensum = reader.GetInt32(1);
                    Materia miMateria = new Materia();
                    miMateria.Nombre = reader.GetString(0);
                    miMateria.HorasTeoria = reader.GetInt32(3);
                    miMateria.HorasPractica = reader.GetInt32(4);
                    miMateria.Codigo = reader.GetInt32(5);
                    miPrelacion.MiMateriaPensum = miMateria;
                    miPrelacion.CreditoMateriaPensum = reader.GetInt32(2);
                    miListaPrelacion.Add(miPrelacion);
                }

                return miListaPrelacion;

            }
            catch (SqlException)
            {
                return miListaPrelacion;//cambiar luego es una prueba
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }

        }

        #endregion fin de Consultar Materias de un Pensum Activo

        #region Consultar periodos academicos de un pensum
        /// <summary>
        /// Metodo que consulta en que periodo academico estuvo un pensum
        /// el retorno es solo informafion adicional del pensum
        /// </summary>
        /// <param name="miPensum"></param>
        /// <returns>Retorna una lista de string con los periodos academicos</returns>
        public List<String> periodosActivos(int miPensum)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<String> periodos = new List<String>();
            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_periodos_activos]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_pensum", miPensum);
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    String fechaInicio = "";
                    String fechaFin = "";
                    fechaInicio = reader.GetString(0);
                    fechaFin = reader.GetString(1);
                    periodos.Add(fechaInicio + " al " + fechaFin);
                }
                return periodos;
            }
            catch
            {
                return periodos;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }

        }
        #endregion

        #region Consultar prelaciones de una materia
        /// <summary>
        /// Este metodo me devuelve una lista de materias que pueden prelar a una materia en cuestion
        /// </summary>
        /// <param name="idPensum"> el id del pensum donde se cumple esta prelacion</param>
        /// <param name="nombreMateria"> el nombre de la materia</param>
        /// <returns>Lista de la materia que prelan a nombreMateria</returns>
        public List<Materia> materiasNecesarias(int idPensum, string nombreMateria)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Materia> prelaciones = new List<Materia>();
            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_prelacion_materia]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@nombre_materia", nombreMateria);
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters["@nombre_materia"].Direction = ParameterDirection.Input;
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Materia miMateria = new Materia();
                    miMateria.Nombre = reader.GetString(0);
                    prelaciones.Add(miMateria);
                }

                return prelaciones;
            }
            catch (SqlException)
            {
                return prelaciones;//retorno sin prelaciones
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        #endregion

        #region Consular todos los Pensum Inactvidos de una escuela
        /// <summary>
        /// Metodo que retonar una lista de pensum
        /// </summary>
        /// <param name="pensumEscuela">el obejto escuela </param>
        /// <returns>retorna los ID de los pensum de la escuela </returns>
        public List<Pensum> ConsultarPensumInactivos(Escuela pensumEscuela)
        {
            List<Pensum> misPensums = new List<Pensum>();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_ver_pensums_inactivos_escuela]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_escuela", pensumEscuela.IdEscuela);
                command.Parameters["@id_escuela"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Pensum pensumInactivo = new Pensum();
                    pensumInactivo.IdPensum = reader.GetInt32(0);
                    misPensums.Add(pensumInactivo);
                }

                return misPensums;
            }
            catch (SqlException)
            {
                return misPensums;
            }

            finally
            {
                miConexion.CerrarConexionBd();
            }



        }
        #endregion

        #region Consular el Pensum Activo de una escuela
        /// <summary>
        /// Metodo que retona el pensum activo
        /// </summary>
        /// <param name="pensumEscuela">el obejto escuela </param>
        /// <returns>retorna el pensum (solo con info en el campo del id) activo de la escuela </returns>
        public int ConsultarPensumActivo(int pensumEscuela)
        {
            Pensum PensumActivo = new Pensum();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_pensum_activo_escuela]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_escuela", pensumEscuela);
                command.Parameters["@id_escuela"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    PensumActivo.IdPensum = reader.GetInt32(0);
                }
                return PensumActivo.IdPensum;
            }

            catch (SqlException)
            {
                return 0;//no se encontro el pensum activo
            }

            finally
            {
                miConexion.CerrarConexionBd();
            }

        }

        #endregion

        #region Consultar a que escuela pertnece el estudiante
        /// <summary>
        /// Metodo que retorna el id de la escuela
        /// </summary>
        /// <param name="_idUsuario">el id del usuario que se logueo</param>
        /// <returns>el id de la escuela a la que pertenece</returns>
        /// 
        public int ConsultarEscuelaEstudiante(int _idUsuario)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            int idBuscado=0;
            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_escuela_estudiante]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idEstudiante", _idUsuario);
                command.Parameters["@idEstudiante"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    idBuscado = reader.GetInt32(0); 
                }
                return idBuscado;
            }
            catch (SqlException)
            {
                return 0;//No encontro al estudiante
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
            
        }
        #endregion

        #region Consultar a que escuela pertnece el profesor
        /// <summary>
        /// Metodo que retorna el id de la escuela
        /// </summary>
        /// <param name="_idUsuario">el id del usuario que se logueo</param>
        /// <returns>el id de la escuela a la que pertenece</returns>
        /// 
        public int ConsultarEscuelaProfesor(int _idUsuario)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            int idBuscado=0;
            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_escuela_profesor]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idProfesor", _idUsuario);
                command.Parameters["@idProfesor"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    idBuscado = reader.GetInt32(0);
                }
                return idBuscado;
            }
            catch (SqlException)
            {
                return 0;
            }

            catch (Exception e)
            {
                return 0;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }


        }
        #endregion

        #region Eliminar un pensum - Cambio de estatus
        /// <summary>
        /// DesactivarPensum
        /// </summary>
        /// <param name="miPensum">el pensum a desactivar</param>
        /// <returns>El pesum queda desactivado en el sistemas, mas no eliminado</returns>
        public bool DesactivarPensum(Pensum miPensum) 
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            DateTime tiempo = DateTime.Now;
            String fechaInicioPeriodo="";
            String fechaFinPeriodo="";
            String fechaFinPensum ="";
             //solo se puede activar o desactivar un pensum en los meses febrero, Agosto y Septimebre.  
            // Para efectos de prueba se agrega el mes de enero dentro de este rango de tiempo
            try { //si de desactiva en en febrero, quiere decir que el periodo academico comenzo en octubre
                if (tiempo.Month.Equals(2) || tiempo.Month.Equals(1))
                {
                    fechaInicioPeriodo="10/01/"+tiempo.AddYears(-1).ToString("yyyy");
                    fechaFinPeriodo = tiempo.AddMonths(1).ToString("MM") + "/" + tiempo.Date.ToString("dd") + "/" + tiempo.AddYears(0).ToString("yyyy");
                    fechaFinPensum  = tiempo.AddMonths(1).ToString("MM") + "/" + tiempo.Date.ToString("dd") + "/" + tiempo.AddYears(0).ToString("yyyy");
                }

                else //si de desactiva en en Agosto o Septiembre, quiere decir que el periodo academico comenzo en marzo
                    if (tiempo.Month.Equals(8) || tiempo.Month.Equals(9))
                    {
                        fechaInicioPeriodo="03/01/"+tiempo.Year.ToString();
                        fechaFinPeriodo="07/30/"+tiempo.Year.ToString();
                        fechaFinPensum=tiempo.Month.ToString()+"/"+tiempo.Date.ToString()+"/"+tiempo.Year.ToString(); 
                    }  
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_desactivar_pensum]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idPensum", miPensum.IdPensum);
                command.Parameters.AddWithValue("@fechaFin", fechaFinPensum);
                command.Parameters.AddWithValue("@fechaFinPeriod", fechaFinPeriodo);
                command.Parameters.AddWithValue("@fechaInicioPeriod", fechaInicioPeriodo);
                command.Parameters["@idPensum"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaFin"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaFinPeriod"].Direction = ParameterDirection.Input;    
                command.Parameters["@fechaInicioPeriod"].Direction = ParameterDirection.Input;
                command.ExecuteReader();
                return true;
                
            }

            catch (SqlException)
            {
                return false;
            }

            catch (Exception e)
            {
                return false;
            }
            finally 
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion

        #region Activar un pensum - Cambio de estatus
        /// <summary>
        /// Cambia el estatus de un pensum de DESACTIVADO => ACTIVADO
        /// </summary>
        /// <param name="miPensum">El pensum a activar</param>
        /// <returns>el pensum activado</returns>
        public bool ActivarPensum(Pensum miPensum)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            DateTime tiempo = DateTime.Now;
            String fechaInicioPeriodo = "";
            String fechaFinPeriodo = "";
            String fechaFinPensum = "";

            try
            {
                if (tiempo.Month.Equals(2) || tiempo.Month.Equals(1))
                {
                    fechaInicioPeriodo = "03/01/" + tiempo.AddYears(0).ToString("yyyy");
                    fechaFinPeriodo = tiempo.AddMonths(5).ToString("MM") + "/30/" +tiempo.AddYears(0).ToString("yyyy");
                    fechaFinPensum = fechaFinPeriodo;
                }

                else
                    if (tiempo.Month.Equals(8) || tiempo.Month.Equals(9))
                    {
                        fechaInicioPeriodo = "10/01/" + tiempo.AddYears(0).ToString("yyyy");
                        fechaFinPeriodo = "02/30/" + tiempo.AddYears(0).ToString("yyyy");
                        fechaFinPensum = fechaFinPeriodo;
                    }
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[sp_activar_pensum]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idPensum", miPensum.IdPensum);
                command.Parameters.AddWithValue("@fechaFin", fechaFinPensum);
                command.Parameters.AddWithValue("@fechaFinPeriod", fechaFinPeriodo);
                command.Parameters.AddWithValue("@fechaInicioPeriod", fechaInicioPeriodo);
                command.Parameters["@idPensum"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaFin"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaFinPeriod"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaInicioPeriod"].Direction = ParameterDirection.Input;
                command.ExecuteReader();
                return true;

            }

            catch (SqlException)
            {
                return false;
            }

            catch (Exception e)
            {
                return false;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion

        #region Devuelve un pensum
        /// <summary>
        /// Este metodo devuelve un Pensum con su id y status 
        /// </summary>
        public Pensum DevolverPensum(int idPensum)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[devolverPensum]";
                command.CommandTimeout = 10;

                //se ejecuta el metodo del store procedure que busca todas las materias del sistema
                reader = command.ExecuteReader();
                Pensum miPensum = new Pensum();
                //Se recorre cada row
                while (reader.Read())
                {

                    miPensum.IdPensum = reader.GetInt32(0);
                    miPensum.StatusPensum = reader.GetString(1);
                }

                return miPensum;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin de Devolver Pensum

        #region Devuelve posibles prelaciones de un pensum segun el semestre de una materia

        /// <summary>
        /// Este metodo devuelve las posibles prelaciones que puede tener una materia
        /// Devuelve una lista de materias con su id inferiores al semestre pasado
        /// </summary>
        public List<Prelacion> devolverPrelaciones(int semestre, int idPensum)
        {
            //Se instancia un objeto conexion 
            List<Prelacion> milistaMateria = new List<Prelacion>();
            //Prelacion miMateria = new Prelacion();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            String nombreMateria;
            int codigoMateria;

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[posibles_prelaciones]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@semestre", semestre);
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters["@semestre"].Direction = ParameterDirection.Input;
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;

                //se ejecuta el metodo del store procedure que busca todas las materias del sistema
                reader = command.ExecuteReader();

                //Se recorre cada row
                while (reader.Read())
                {
                    Prelacion miMateria = new Prelacion();
                    nombreMateria = reader.GetString(0);
                    semestre = reader.GetInt32(1);
                    codigoMateria = reader.GetInt32(2);
                    Materia laMateria = new Materia();
                    laMateria.Nombre = nombreMateria;
                    laMateria.Codigo = codigoMateria;
                    miMateria.MiMateriaPensum = laMateria;
                    miMateria.SemestreMateriaPensum = semestre;
                    milistaMateria.Add(miMateria);

                }

                return milistaMateria;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion

        #region Modificar Materia del pensum
        /// <summary>
        ///Modifica un pensum, agrega o quita prelaciones nuevas a una materia
        ///Devuelve un bool que confirma si la modificacion fue realizada(true)
        ///o no fue efectiva (false)
        /// </summary>

        public bool modificarMateriaPensum(Prelacion miMateria, int idPensum)
        {
            bool statusModificacion = false;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            int idMateria = miMateria.MiMateriaPensum.Codigo;
            
            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[eliminarMateriaPensum]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters.AddWithValue("@id_materia", idMateria);
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                command.Parameters["@id_materia"].Direction = ParameterDirection.Input;
                command.ExecuteReader();

                if (miMateria.Prelaciones != null)
                {
                    
                    for (int indiceDeMaterias = 0; indiceDeMaterias < miMateria.Prelaciones.Count; indiceDeMaterias++)
                    {
                        insertarPrelacionBD(miMateria, idMateria, miMateria.Prelaciones[indiceDeMaterias].Codigo, idPensum);
                    }
                    statusModificacion = true;
                    return statusModificacion;
                }
                else
                {
                    InsertarSinPrelacion(miMateria, idPensum);
                    statusModificacion = true;
                    return statusModificacion;
                }
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }

            finally
            {
                miConexion.CerrarConexionBd();
            }
        }


        #endregion Fin de modificar materia del pensum

        #region Eliminar la prelacion de una materia del Pensum
        /// <summary>
        ///Elimina la existencia de una materia en el pensum
        /// </summary>

        public void eliminarMateriaPrelacion(int idPensum, int idMateria, int idMateriaPrela)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[eliminarMateriaPrelacion]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters.AddWithValue("@id_materia", idMateria);
                command.Parameters.AddWithValue("@id_materia_prela", idMateriaPrela);
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                command.Parameters["@id_materia"].Direction = ParameterDirection.Input;
                command.Parameters["@id_materia_prela"].Direction = ParameterDirection.Input;
                command.ExecuteReader();
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion Fin eliminar la prelacion de una materia del Pensum

        #region Mostrar materias que no estan en un pensum
        /// <summary>
        /// Este metodo devuelve una lista de las materias que no estan incluidas en el pensum seleccionado
        /// </summary>
        public List<Materia> materiasSinPensumSeleccionado(int idPensum)
        {
            List<Materia> listaMaterias = new List<Materia>();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[materiasSinPensumSeleccionado]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idPensum", idPensum);
                command.Parameters["@idPensum"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Materia miMateria = new Materia();
                    miMateria.Nombre = reader.GetString(1);
                    miMateria.Codigo = reader.GetInt32(0);
                    listaMaterias.Add(miMateria);
                }
                return listaMaterias;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }

            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin de mostrar materias que no estan en un pensum

        #region Eliminar la prelacion de una materia
        /// <summary>
        /// Este metodo elimina las prelaciones de una materia en el pensum
        /// Asignando null a el valor de prelacion
        /// </summary>
        public void quitarPrelacion(int idPensum, int idMateria)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[quitarPrelacion]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters.AddWithValue("@id_materia", idMateria);
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                command.Parameters["@id_materia"].Direction = ParameterDirection.Input;
                command.ExecuteReader();
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin de eliminar la prelacion de una materia

        #region Agregar una materia sin prelaciones establecidas
        /// <summary>
        /// Este metodo inserta  una materia en el pensum sin prelaciones
        /// </summary>
        public void InsertarSinPrelacion(Prelacion miPrelacion, int idPensum)
        {
            //Se instancian las conexiones
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarSinPrelacion]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server
                command.Parameters.AddWithValue("@semestre", miPrelacion.SemestreMateriaPensum);
                command.Parameters.AddWithValue("@numCredito", miPrelacion.CreditoMateriaPensum);
                command.Parameters.AddWithValue("@fk_id_materia", miPrelacion.MiMateriaPensum.Codigo);
                command.Parameters.AddWithValue("@fk_id_pensum", idPensum);

                command.Parameters["@semestre"].Direction = ParameterDirection.Input;
                command.Parameters["@numCredito"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_id_materia"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_id_pensum"].Direction = ParameterDirection.Input;
                command.ExecuteReader();
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin de agregar una materia sin prelaciones

        #region Numero de prelaciones de una materia
        /// <summary>
        /// Este metodo numero de prelaciones que tiene una materia con respecto a otras
        /// </summary>
        public int numeroPrelaciones(int idMateria, int idPensum)
        {
            int numeroPrelacion = 0;
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[numeroPrelaciones]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_materia", idMateria);
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters["@id_materia"].Direction = ParameterDirection.Input;
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                //se ejecuta el metodo del store procedure que busca todas las materias del sistema
                reader = command.ExecuteReader();

                //Se recorre cada row
                while (reader.Read())
                {
                    numeroPrelacion = reader.GetInt32(0);
                }
                return numeroPrelacion;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin numero de prelaciones de una materia

        #region Materias que usan otra materia en sus prelaciones
        /// <summary>
        /// Este metodo devuelve materias que han usado prelaciones de otra materia que sera eliminada
        /// </summary>
        public List<Materia> buscarMateriasUsanPrelaciones(int idMateria, int idPensum)
        {

            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Materia> milistaMateria = new List<Materia>();
            milistaMateria = null;

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[buscarMateriasUsanPrelaciones]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_materia", idMateria);
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters["@id_materia"].Direction = ParameterDirection.Input;
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                //se ejecuta el metodo del store procedure que busca todas las materias del sistema
                reader = command.ExecuteReader();

                //Se recorre cada row
                while (reader.Read())
                {
                    Materia miMateria = new Materia();
                    miMateria.Nombre = reader.GetString(0);
                    miMateria.Codigo = reader.GetInt32(1);
                    if (milistaMateria != null)
                    {
                        milistaMateria.Add(miMateria);
                    }
                    else
                    {
                        milistaMateria = new List<Materia>();
                        milistaMateria.Add(miMateria);
                    }
                }
                return milistaMateria;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin Materias que usan otra materia en sus prelaciones

        #region Eliminar una materia del pensum
        /// <summary>
        /// Este metodo elimina una materia del pensum
        /// Devuelve true si fue eliminada, false sino
        /// </summary>
        public bool eliminarMateriaPensum(int idMateria, int idPensum)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            bool confirmacionEliminacion = false;

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[eliminarMateriaPensum]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_materia", idMateria);
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters["@id_materia"].Direction = ParameterDirection.Input;
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                //se ejecuta el metodo del store procedure que busca todas las materias del sistema
                command.ExecuteReader();
                confirmacionEliminacion = true;
                return confirmacionEliminacion;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
                return confirmacionEliminacion;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion Eliminar una materia del pensum

        #region Trae informacion sobre una materia
        /// <summary>
        /// Este metodo trae informacion sobre una materia
        /// Su semestre y sus creditos
        /// </summary>
        public Prelacion traerDatosMateriaPensum(int idMateria, int idPensum)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            Prelacion miPrelacion = new Prelacion();

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[traerDatosMateriaPensum]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_materia", idMateria);
                command.Parameters.AddWithValue("@id_pensum", idPensum);
                command.Parameters["@id_materia"].Direction = ParameterDirection.Input;
                command.Parameters["@id_pensum"].Direction = ParameterDirection.Input;
                //se ejecuta el metodo del store procedure que busca todas las materias del sistema
                reader = command.ExecuteReader();

                //Se recorre cada row
                while (reader.Read())
                {
                    miPrelacion = new Prelacion();
                    miPrelacion.CreditoMateriaPensum = reader.GetInt32(1);
                    miPrelacion.SemestreMateriaPensum = reader.GetInt32(0);

                }
                return miPrelacion;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin de Trae informacion sobre una materia

        #region Devuelve todos los pensums inactivos
        /// <summary>
        /// Este metodo muestra todos los pensums que no han sido activados
        /// </summary>
        public List<Pensum> pensumsInactivos(int idEscuela)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            Pensum miPensum = new Pensum();
            List<Pensum> listaPensum = new List<Pensum>();
            listaPensum = null;

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[pensumsNuncaActivados]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@id_escuela", idEscuela);
                command.Parameters["@id_escuela"].Direction = ParameterDirection.Input;
                //se ejecuta el metodo del store procedure que busca todas las materias del sistema

                reader = command.ExecuteReader();

                //Se recorre cada row
                while (reader.Read())
                {
                    miPensum = new Pensum();
                    miPensum.IdPensum = reader.GetInt32(0);
                    if (listaPensum != null)
                    {
                        listaPensum.Add(miPensum);
                    }
                    else
                    {
                        listaPensum = new List<Pensum>();
                        listaPensum.Add(miPensum);
                    }
                }

                return listaPensum;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion fin de Trae informacion sobre una materia

    }
}
